/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja.de.trabajo.pkg6;

/**
 *
 * @author Roberto Juarez
 */
public class BinaryTree<E> {
   
    
        protected E value;                                                      
        protected BinaryTree <E> parent;                                                
        protected BinaryTree <E> left;                                          
        protected BinaryTree <E> right;                                         
        
       
        public BinaryTree() {
            left = null;
            right = null;
            value = null;
            parent = null;
        }
        
        
        
        public  BinaryTree(E val) {
            value = val;
            right = left = new BinaryTree<E>();
            left = null;
            right = null;
        }
        
        
        /**
         * 
         * @param val
         * @param left
         * @param right 
         */
        public BinaryTree(E val, BinaryTree<E> left, BinaryTree<E> right) {
            value = val;
            if (left == null) 
                left = new BinaryTree<E>();
            setLeft(left);
            if (right == null)
                right = new BinaryTree<E>();
            setRight(right);
        }
        
        
    
        
        
        /**
         * Método que permite reasignar al padre
         * @param p 
         */
        protected void setParent(BinaryTree<E> p) {
            parent = p;
        }
        
        
        /**
         *
         * @param lef 
         */
        public void setLeft(BinaryTree<E> lef) {
            if (left != null && left.getParent() == this)
                left.setParent(null);
            left = lef;
            left.setParent(this);
        }
        
        
        /**
         * 
         * @param rig 
         */
        public void setRight(BinaryTree<E> rig) {
            if (right != null && right.getParent() == this)
                right.setParent(null);
            right = rig;
            right.setParent(this);
        }
        
        
        /**
         * Método que permite definir un valor específico al nodo asociado.
         * @param val 
         */
        public void setValue(E val) {
            value = val;
        }
        
        
        /**
         * 
         * @return arbol parent Devuelve al padre del arbol
         */
        protected BinaryTree<E> getParent() {
            return(this.parent);
        }
        
        
        /**
         *
         * @return Devuelve arbol izquierdo
         */
        public BinaryTree<E> getLeft() {
            return(left);
        }
        
        
        /**
         * 
         * @return Devuelve arbol derecho
         */
        public BinaryTree<E> getRight() {
            return(right);
        }
        
        
        /**
         * 
         * @return valor del nodo asociado
         */
        public E getValue() {
            return value;
        }
        
}